4. Liste simple


4.1 Definitii, modele, proprietati

4.2 Creare

4.3 Traversare

4.4 Inserare, stergere, interschimb

4.5 Concatenare

4.6 Calcul indicatori de performanta

4.7 Sortarea

back data structures curricula

4.1 Definitii, modele, proprietati

Lista simpla este o structura dinamica.
Se caracterizeaza prin:
- o variabila pointer care contine adresa unei zone de memorie numita primul element al listei.
- zona de memorie se compune din doua subzone: o zona cu informatii utile si o variabila pointer ce contine adresa elementului urmator
- celelalte elemente ale listei legate intre ele
- ultimul element al listei care are variabila pointer initializata cu NULL pentru a marca inexistenta unui element urmator.
Modelul graf presupune:
- o multime de noduri
- o multime de arce
- fiecare nod este legat de altul PRINTR-UN SINGUR ARC
- un nod care nu are un arc incident spre el
- un nod care nu are nici un arc incident spre exterior.
Nodelul text sursa presupune o secventa de definire recursiva de articol.
Modelul analitic presupune existenta elementelor E1, E2, E3,....,Ex.
Fiecare element are un camp de informatie utila IU si un pointer de legatura PL.
Exista o variabila pointer cu care se refera primul element P1.
cont(P1)=adr(E1)
cont(Ei.PL)=adr(Ei+1)
i=1,2,3,..,x-1
cont(Ex.PL)=NULL
cont(Ei.IU) = siri, i=1,2,..,x
Daca lementele listei simple se definesc prin:
struct lista_simpla{
int info;
struct lista_simpla *next;
};
struct lista_simpla a,b,c, *p;
si daca se initializeaza corespunzator aceste variabile, referirea elementelor direct folosind pointerul i presupune folosirea repetata a operatorului de referire cu variabile pointeri.

....................
....................
....................
....................
....................
....................
....................
....................
revenire

4.2 Creare

Crearea listei se efectueaza prin adaugare de elemente.
Mai intai se aloca zona de memorie.
Dupa aceea se initializeaza cu NULL variabila pointer.
Se initializeaza campurile corespunzatoare informatiei utile. Aceasta parte difera de la aplicatie la aplicatie si de aceea trebuie externalizata procedurii.
Se construiesc legaturile zonei alocate si initializate cu restul listei simple existetnta.
Pentru o lista definita cu informatia utila ca articol, careia ii corespunde descrierea, iar initializarea presupun atribuiri si apelul functiei strcpy().

....................
....................
....................
....................
....................
....................
....................
....................
revenire

4.3 Traversare

Pentru traversare trebuie scrisa o procedura care asigura:
- referirea elementelor in totalitate
- referirea din aproape in aproape
- referirea elementelor din aproape in aproape, pana este gasit un element cautat
- extragerea informatiei utile
- returnarea adresei elementului cautat.
Traversarea conduce la extragerea informatiei utile si afisarea acesteia sau intrebuintarea ei la efectuarea de calcule.
Pentru traversare, procedura utilizeaza fie instructiunea for(), fie instructiunea while().
Daca lista simpla are definirile:
struct lista{
int info;
struct lista *next;
};
typedef struct lista * PLIST;
numararea elementelor din lista simpla presupune o procedura care realizeaza:
- traversarea listei
- incrementarea variabilei contor la referirea unui element din lista
- returnarea contorului.
Pentru numararea elementelor se scrie o procedura in care traversarea se efectueaza cu instructiunea while().
Daca se doreste o traversare folosind for() procedura include o varianta care limiteaza numarul de repetari strict la situatia in care variabila pointer care refera elementele listei simple este diferita de NULL.
Exista doua moduri de a plasa instructiunea de avans in lista.

....................
....................
....................
....................
....................
....................
....................
....................
revenire

4.4 Inserare, stergere, interschimb

Inserarea se realizeaza pentru:
- un element adiacent
- pentru element neadiacent
- pentru siruri de elemente.
Inserarea unui element in lista nevida presupune doua instructiuni de atribuire.
In cazul listei vide inserarea presupune alipirea elementului de adaugat ca prim element.
Luarea in considerare a situatiei in care lista este vida si a situatiei in care lista nu este vida se testeaza daca lista este sau nu vida.
Inserarea ca prim element presupune initializari de pointeri.
Introducerea in fata a unui element se deosebeste de adaugarea ca ultim element a unui element in lista cu procedura addend().
Stergerea se efectueaza:
- pentru intreaga lista simpla
- pentru un element stabilita ca pozitie
- pentru un element stabilit dupa cheie
- pentru un sir consecutiv de elemente stabilite dupa pozitie sau dupa cheie.
Pornind de la interschimbul de elemente din vectori se face trecerea pentru aceeasi operatie, dar cu elemente din liste simple.
Interschimbul se realizeaza pentru:
- patru variabile pointer
- doua variabile pointer
- elemente adiacente
cu ecuatiile corespunzatoare - elemente neadiacente
obtnind siruri de elemente pentru care se scriu ecuatiile
prin care se modifica variabile pointer.
Formele echivalente
de atribuire permit o scriere diferentiata. - identificarea listei simple
- cheile elementelor sau pozitiile
- elementele care se insereaza.
rezultatul returnat de functie este un pointer sau NULL daca operatia nu s-a efectuat.
Sunt situatii in care procedura returneaza 1 daca sunt erori sau 0 daca operatia a decurs normal.

....................
....................
....................
....................
....................
....................
....................
....................
revenire

4.5 Concatenare
Se concateneaza listele L1 si L2.

Concatenarea a doua liste simple presupune:
- test daca listele L1 si L2 sunt vide, caz in care rezultatul concatenarii este NULL
- test daca lista L1 este vida si L2 nu este vida, caz in care rezultatul concatenarii este lista L2
- se testeaza daca lista L2 este vida si L1 nu este caz in care lista concatenata este chiar lista L1.
daca listele L1 si L2 sunt nevide, va rezulta o lista care contine elementele din ambele liste.
Acestea sunt rezumate in schema de traversare care tine seama de toate situatiile.
Concatenarea este necomutativa, adica L1||L2 != L2||L1.
Concatenarea a n liste simple presupune apelul procedurii de concatenare intr-o structura repetitiva in varianta in care:
- se transmit ca parametri pointerii cu care se refera primul element din liste ca elemente ale unui vector de pointeri
- se transmit pointerii ca informatie utila din elementele unei liste simple.
Procedura destinata concatenarii are 4 instructiuni return.
Printr-un mod de aranjare a testelor, numarul de instructiuni return se reduce la o singura aparitie.
In cazul in care se doreste concatenarea mai multor liste, trebuie:
- memorate adresele de referire a elementelor cap de lista intr-un vector de pointeri
- asigurata traversarea vectorului de pointeri cu o instructiune for()
- proceduraconcatenate din aproape in aproape listele ramase, cu lista rezultata la iteratia precedenta,asa cum rezulta in schema de traversare a vectorului de pointeri.
Concatenarea se realizeaza:
- cu mentinerea informatiilor care separa listele initiale
- fara mentinerea informatiilor dar cu efectuarea de teste intre pointer element urmator si pointer cap de lista.

....................
....................
....................
....................
....................
....................
....................
....................
revenire

4.6 Calcul indicatori de performanta

Pentru fiecare aplicatie, utilizarea listelor simple trebuie sa fie comparata cu alte structuri si sa se dovedeasca avantajul folosirii acestora cu ajutorul valorilor calculate pentru indicatori precum:
- numar instructiuni
- durata executie
- complexitate program
- grad de utilizare memorie
- fiabilitate program
- nivel reutilizare software
- portabilitate
- mentenabilitate.
Pentru fiecare indicator se culeg date si se fac calcule.
Prin comparatie cu matricele se vor vedea avantajele mai ales in zona gradului de utilizare memorie.

....................
....................
....................
....................
....................
....................
....................
....................
revenire

4.7 Sortarea
Sortarea cu interschimbul
informatiei utilize presupune numai traversarea listei si lucru pe informatia utila.
Sortarea cu interschimbul
de legaturi presupune traversarea listei si modificarea continutului pointerilor.
Informatia utila ramane nemodificata.
Sortarea cu modificarea legaturilor dar si conservarea vechilor pozitii
presupune:
- existenta a doi pointeri pentru a face referiri pentru noile legaturi si pentru vechile legaturi
- copierea vechilor legaturi in variabile pointeri definite in elemente
- realizarea interschimburilor de continut intre variabilele pointeri.
revenire